各种排序算法汇集
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private void Sort1(int[] list)//冒泡排序 { //从第一个字符向后冒泡亮亮比较获取最大值放在最后 //第一次循环首先得到一个最大值;第二次循环得到第二大值 int i, j, temp; bool done = false; j = 1; while ((j < list.Length) && (!done)) { done = true; for (i = 0; i < list.Length - j; i++) { if (list[i] > list[i + 1]) { done = false; temp = list[i]; list[i] = list[i + 1]; list[i + 1] = temp; } } j++; } } //选择排序 //向后冒泡获取最小值的索引,然后和第i个值进行数据交换 private void Sort2(int[] list) { int minIndex = 0; for (int i = 0; i < list.Length; i++) { minIndex = i; for (int j = i; j < list.Length; j++) { if (list[j] < list[minIndex]) { minIndex = j; } } int temp = list[i]; list[i] = list[minIndex]; list[minIndex] = temp; } } //插入排序 //此种算法是首先循环第二个元素,让第二个元素和第一个元素比较,如果i+1<i,交换。 //然后依次进行,如果是循环第i个元素,i索引的数据将会和前边所有的数据进行比较,如果i索引数据小于后边的数据,则继续下去知道最后一个进行替换,否则跳出继续下一个; private void Sort3(int[] list) { for (int i = 1; i < list.Length; i++) { int t = list[i]; for (int j = i; j > 0; j--) { if (list[j - 1] > t) { list[j] = list[j - 1]; list[j - 1] = t; } } } } private void Sort4(int[] list)//希尔排序 { //list.Length=25; int inc; for (inc = 1; inc <= list.Length / 9; inc = 3 * inc + 1) ; for (; inc > 0; inc = inc / 3) { for (int i = inc + 1; i <= list.Length; i += inc) { int t = list[i - 1]; int j = i; while ((j > inc) && (list[j - inc - 1] > t)) { list[j - 1] = list[j - inc - 1]; j -= inc; } list[j - 1] = t; } } } //快速排序 private void quick_sort(int[] s, int l, int r) { if (l < r) { int i = l, j = r, data = s[l]; while (i < j) { while (i < j && s[j] >= data) // 从右向左找第一个小于x的数 { j--; } if (i < j) { s[i] = s[j]; i++; } while (i < j && s[i] < data) // 从左向右找第一个大于等于x的数 { i++; } if (i < j) { s[j] = s[i]; j--; } } s[i] = data;//第一次循环获取的是左边的数据都比data小的数据,右边的大于data的数据 quick_sort(s, l, i - 1); // 递归调用 quick_sort(s, i + 1, r); } }