void swap2(int a, int b)
void swap(int* data, int m, int n)
void printArray(int* data, int n)
void bubble1(int* data, int n)
void bubble2(int* data, int n)
void bubble3(int* data, int n)
void bubble4(int* data, int n)
void insertSort1(int* data, int n)
void insertSort2(int* data, int n)
void binaryInsertSort(int* data, int n)
void qs(int* data, int n)
void quickSort(int* data, int low,int high)
int adjust(int* data,int low, int high)
int adjust2(int* data,int low, int high)
// void merge_sort(int* data, int n)
void QuickSort(int* data, int n)
void Qsort(int* data,int lo,int hi)
int Partition(int *data,int lo,int hi)
void NonRecursionQucickSort(int* data, int n)
void norecursionQuickSort(int* data, int low, int high)
void sortPartOrdered(int* data, int low, int mid, int high)
void merge(int* data, int low, int high)
void mergesort(int* data, int n)
void norecursionMerge_sort(int *list, int length)
// void shellSort(int* data, int n)//希尔排序
int data[] ={3,1,6,8,2,4,7,9,0,5}
int main(int argc, char const *argv[])
{
bubble1(data,N)
printArray(data,N)
bubble2(data,N)
printArray(data,N)
bubble3(data,N)
printArray(data,N)
bubble4(data,N)
printArray(data,N)
insertSort1(data,N)
printArray(data,N)
insertSort2(data,N)
printArray(data,N)
binaryInsertSort(data,N)
printArray(data,N)
qs(data,N)
printArray(data,N)
QuickSort(data,N)
printArray(data,N)
NonRecursionQucickSort(data,N)
printArray(data,N)
mergesort(data,N)
printArray(data,N)
norecursionMerge_sort(data,N)
printArray(data,N)
return 0
}
void swap2(int a, int b)
{
a=a+b
b=a-b
a=a-b
}
void printArray(int* data, int n)
{
static int num = 0
++num
printf("%2d ", num)
for (int i = 0
{
printf("%d\t",data[i])
}
}
void swap(int* data, int m, int n)
{
data[m] ^= data[n]
data[n] ^= data[m]
data[m] ^= data[n]
}
void bubble1(int* data,int n)
{
int count = 0
for (int i = 0
{
for(int j=0
{
if(data[j]>data[j+1])
{
swap(data,j,j+1)
count++
}
}
}
}
void bubble2(int* data, int n)
{
int flag = 1
int k = n-1
while(flag)
{
flag = 0
for (int j = 0
{
if(data[j]>data[j+1])
{
swap(data,j,j+1)
flag = 1
}
}
k--
}
}
void bubble3(int* data, int n)
{
int k
int flag = n-1
while(flag)
{
k = flag
flag = 0
for(int j=0
{
if(data[j]>data[j+1])
{
swap(data,j,j+1)
flag = j+1
}
}
}
}
void bubble4(int* data, int n)
{
int k = n-1
int flag =n-1
while(flag)
{
k = flag
flag = 0
for (int i = 0
{
if(data[i]>data[i+1])
{
swap(data,i,i+1)
flag = i+1
}
}
}
}
void insertSort1(int* data, int n)
{
int temp
int j
for(int i=1
{
if(data[i]<data[i-1])
{
temp = data[i]
for(j=i-1
{
data[j+1] = data[j]
}
data[j+1] = temp
}
}
}
void insertSort2(int* data, int n)
{
int temp
int j
for (int i = 1
{
if(data[i]<data[i-1])
{
temp = data[i]
for(j=i-1
data[j+1] = temp
}
}
}
int locate(int* data, int i)
{
/* int j=i-1
while(data[j]>data[i])
--j
return j+1
int low = 0
int high = i-1
int mid
while(low<=high)
{
mid = (low+high)/2
if(data[mid]==data[i]) return mid+1
else if(data[mid]<data[i]) low =mid+1
else high = mid-1
}
return low
}
void binaryInsertSort(int* data, int n)
{
int i,j,temp
int location
for (i = 1
{
if(data[i]<data[i-1])
{
temp = data[i]
location = locate(data,i)
for(j=i-1
{
data[j+1] = data[j]
}
data[location] = temp
}
}
}
/*void shellSort(int* data, int n)
{
}
*/
void qs(int* data, int n)
{
quickSort(data,0,n-1)
}
void quickSort(int* data, int low,int high)
{
int location
if(low<high)
{
location = adjust2(data,low,high)
// location = adjust(data,low,high)
quickSort(data,low,location-1)
quickSort(data,location+1,high)
}
}
int adjust(int* data,int low, int high)
{
int temp = data[low]
while(low<high)
{
while(low<high && data[high]>=temp) --high
if(low<high)
{
data[low] = data[high]
++low
}
while(low<high && data[low]<=temp) ++low
if(low<high)
{
data[high] = data[low]
--high
}
}
data[low] = temp
return low
}
int adjust2(int* data, int l, int h)
{
int temp = data[l]
int low = l
int high = h
while(low<high)
{
while(low<high && data[high]>=temp) --high
while(low<high && data[low]<=temp) ++low
if(low<high)
{
swap2(data[low],data[high])
}
}
data[l] = data[low]
data[low] = temp
return low
}
void QuickSort(int* data, int n)
{
Qsort(data,0,n-1)
}
void Qsort(int* data,int lo,int hi)
{
int k
if(lo<hi)
{
k=Partition(data,lo,hi)
Qsort(data,lo,k-1)
Qsort(data,k+1,hi)
}
}
int Partition(int *data,int lo,int hi)
{
int key=data[lo]
int l=lo-1
int h=hi+1
int temp
for(
{
do{
h--
}while(data[h]>key)
do{
l++
}while(data[l]<key)
if(l<h)
{
temp=data[h]
data[h]=data[l]
data[l]=temp
}
else
{
return h
//各位注意了,这里的返回值是h。不是返回各位习以为常的枢纽元素,即不是l之类的。
}
}
}
void NonRecursionQucickSort(int* data, int n)
{
norecursionQuickSort(data,0,n-1)
}
void norecursionQuickSort(int* data, int low, int high)
{
if(low>=high) return
int S[high]
int p=-1
int l,h
int index
S[++p] = low
S[++p] = high
while(p>=0)
{
h = S[p--]
l = S[p--]
index = Partition(data,l,h)
if(l<index-1)
{
S[++p] = l
S[++p] = index-1
}
if(index+1<h)
{
S[++p] = index+1
S[++p] = h
}
}
}
void mergesort(int* data, int n)
{
merge(data,0,n-1)
}
void merge(int* data, int low, int high)
{
if(low==high) return
int mid = (low+high)/2
merge(data,low,mid)
merge(data,mid+1,high)
sortPartOrdered(data, low, mid,high)
}
void sortPartOrdered(int* data, int low, int mid, int high)
{
if(data[mid]<=data[mid+1]) return
int* temp = (int*)malloc( (high+1)*sizeof(int) )
int i = low
int j = mid+1
int index = -1
while(i<=mid && j<=high)
{
if(data[i]<data[j]) temp[++index] = data[i++]
else temp[++index] = data[j++]
}
while(i<=mid)
{
temp[++index] = data[i++]
}
while(j<=high)
{
temp[++index] = data[j++]
}
for(int k=low
{
data[k] = temp[k-low]
}
}
void norecursionMerge_sort(int *list, int length){ //非递归
int i, left_min, left_max, right_min, right_max, next
int *tmp = (int*)malloc(sizeof(int) * length)
if (tmp == NULL){
fputs("Error: out of memory\n", stderr)
abort()
}
for (i = 1
for (left_min = 0
right_min = left_max = left_min + i
right_max = left_max + i
if (right_max > length)
right_max = length
next = 0
while (left_min < left_max && right_min < right_max)
tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++]
while (left_min < left_max)
list[--right_min] = list[--left_max]
while (next > 0)
list[--right_min] = tmp[--next]
}
free(tmp)
}