排序:使乙個無序序列轉變為有序序列的過程
排序的穩定性:
假設ki = kj, (1<= i <= n, 1<= j <= n, i != j),且在排序前的序列中ri領先於rj(即i如果排序後ri仍領先於rj,則稱所用的排序方法是穩定的,否則是不穩定的
影響排序演算法效能的幾個要素:
時間效能,輔助空間、演算法的複雜性
氣泡排序:每次取相鄰兩個數做比較,並在符合交換條件時交換,直到整個陣列均符合條件
#include #include void print(int *k, int n)}}
print(k, n);
printf("此次共進行了%d次比較,%d次移動~\n", count1, count2);
}//正宗的氣泡排序演算法(從下往上冒)
void truebubblesort(int *k, int n)}}
print(k, n);
printf("此次共進行了%d次比較,%d次移動~\n", count1, count2);
}//正宗的氣泡排序演算法優化
void bettertruebubblesort(int *k, int n)}}
print(k, n);
printf("此次共進行了%d次比較,%d次移動~\n", count1, count2);
}int main()
; //int b[10] = ;
//int c[10] = ;
int n = 10;
print(a, n);
printf("\n不正宗的氣泡排序:\n\n");
bubblesort(a, n);
printf("\n正宗的氣泡排序:\n\n");
truebubblesort(a, n);
printf("\n正宗的氣泡排序優化:\n\n");
bettertruebubblesort(a, n);
return 0;
}
選擇排序(一般比氣泡排序效率高):在陣列中每次選取最大或最小的數移到最前面(迭代範圍依次減1),直到陣列有序
#include void print(int *k, int n)
k[j+1] = temp;}}
print(k, n);
}int main(void)
; int a[10] = ;
int n = 10;
print(a, n);
printf("\n直接插入排序:\n\n");
insertsort(a, n);
return 0;
}
希爾排序:時間複雜度(n*logn)每次排序取一定的間隔對子陣列進行比較,期間間隔不斷縮小直至為1
#include #include void print(int *k, int n)
k[j+gap] = temp;}}
}while(gap > 1);
print(k, n);
}int main(void)
; int a[10] = ;
int n = 10;
print(a, n);
printf("\n希爾排序:\n\n");
insertsort(a, n);
return 0;
}
堆排序:利用堆進行排序,將待排序的序列構造成堆(大頂堆或小頂堆),求最大值時取堆頂元素與末尾元素交換,再將剩餘的元素重新構造成堆,重複上述操作,直至排序完成
#include #include int count = 0;
void print(int *k, int n)
printf("\n");
}void swap(int *k, int i, int j)
void heapadjust(int *k, int s, int n)
if(temp >= k[i])
k[s] = k[i];
s = i;
}k[s] = temp;
}void heapsort(int *k, int n)
for(i=n; i>1; i--)
print(k, n);
}int main(void)
; int n = 9;
print(a, n);
printf("\n堆排序:\n\n");
heapsort(a, n);
printf("總共進行%d次比較~\n", count);
return 0;
}
歸併排序:
2路歸併排序:將有n個記錄的序列看成是擁有n個有序的子串行,每個子串行長度為1,然後兩兩歸併,得到n/2個長度為2的有序子串行,在兩兩歸併,依此類推,直到得到長度為n的有序序列
#include #include #define maxsize 10
//列印陣列
void print(int *k, int n)
}int main(void)
; int n = 10;
print(a, n);
printf("\n堆排序:\n\n");
mergesort(a, n);
print(a, n);
return 0;
}
#include #include #define maxsize 10
//列印陣列
void print(int *k, int n)
next = 0;
while(left_min < left_max && right_min < right_max)
else
}//當左區間存在較大值時,將剩下的值放到右區間最右處
while(left_min < left_max)
//將暫存在temp空間中的已排序序列放回原陣列中
while(next > 0)}}
}int main(void)
; int n = 10;
print(a, n);
printf("\n堆排序:\n\n");
mergesort(a, n);
print(a, n);
return 0;
}
快速排序:
#include #include #define maxsize 10
//列印陣列
void print(int *k, int n)
swap(k, low, high);
while(low < high && k[low] <= point)
swap(k, low, high);
}return low;
}void qsort(int *k, int low, int high)
}//快速排序
void quicksort(int *k, int n)
int main(void)
; int n = 10;
print(a, n);
printf("\n快速排序:\n\n");
quicksort(a, n);
print(a, n);
return 0;
}
快速排序演算法優化:
1.優化選取基準點:三數取中法,從序列中任意取三個數取中間的值作為基準點
2.優化掉不必要的交換:
3.優化小陣列時的排序方案:待插入陣列規模小,直接插入;大規模,快速排序(有遞迴)
4.優化遞迴操作:
優化示例:
/*快速排序演算法的優化(三數取中法)*/
#include #include #define maxsize 10
//列印陣列
void print(int *k, int n)
if(k[m] > k[high])
if(k[m] > k[low])
point = k[low];
while(low < high)
swap(k, low, high);
while(low < high && k[low] <= point)
swap(k, low, high);
}return low;
}void qsort(int *k, int low, int high)
}//快速排序
void quicksort(int *k, int n)
int main(void)
; int n = 10;
print(a, n);
printf("\n快速排序:\n\n");
quicksort(a, n);
print(a, n);
return 0;
}
排序演算法:
1.插入排序類:直接插入排序,希爾排序
2.選擇排序類:選擇排序、堆排序
3.交換排序類:氣泡排序,快速排序
4.歸併排序類:歸併排序
各排序演算法特點:
資料結構和演算法 排序
一 簡單排序 1.氣泡排序o n 2 兩兩比較,反序交換 public static int bubblesort int arr return arr 2.選擇排序o n 2 public static int selectsort int arr if i minindex return arr...
資料結構和演算法 排序演算法 希爾排序
希爾排序 希爾排序 希爾排序就是插入排序的一種改進版本,演算法的步驟 把乙個序列不視為乙個整體,而是視為多個子串行,假設間隔是gap 4 alist 54,26,93,17,77,31,44,55,20 54,26,93,17,77,31,44,55,20 54 77 20 這是1 組,間隔是4,2...
資料結構和演算法 排序演算法 氣泡排序
排序演算法 排序演算法,我們想要把線性表中的無序序列,排成有序序列,的演算法,就是排序演算法,排序演算法的穩定性 舉例 假設對下面的元組要以他們的第乙個數字來排序。4,1 3,1 3,7 5,6 如果你排序之後,3,1 3,7 和原來的順序一樣,就是穩定的,否則就是不穩定的,3,1 3,7 4,1 ...